#ifndef FACTORY_PID_H
#define FACTORY_PID_H

/**
  *************************************************************************************************
  * @file     FACTORYPIDH.h
  * @author   
  * @version  V1.0.0
  * @date     2021.7.24
  * @brief    控制算法pid的程序实现，宏函数形式
  * @remarks
  **************************************************************************************************
  * @attention  1、该文件用宏定义函数写成，使用之前需要先声明使用对象，声明使用对象才能调用相应的函数，有点类似于面向对象语言的类和对象
  *             2、文件包含位置式pid与增量式pid，根据需求自行调用
  **************************************************************************************************
  */
#define CLIP(v,a,b) ( ( v>b?b:(v<a?a:v) ) )



#define MAKE_VALUE_G(name,type,inival)\
static type g_##type##name = inival;\
type Get_##name(){ return g_##type##name; }\
void Set_##name(type val){ g_##type##name = val; }\
void Inc_##name(){ ++g_##type##name; }

#define USE_EXT_VALUE_G(name,type)\
extern type Get_##name();\
extern void Set_##name(type val);\
extern void Inc_##name();


#define MAKE_FUNC_PID_S(name,type,Dw,Up) \
static inline type name(type E,const type P, const type I, const type D, unsigned char bCls)\
{\
	static type lastE = 0, SumE = 0;\
	type fY = 0;\
	if( !bCls ){\
		SumE += E;\
		SumE = (SumE>Up?Up:(SumE<Dw?Dw:SumE));\
		fY = P*E + I*SumE + D*(E-lastE);\
		lastE = E;\
  }else{ lastE = SumE = 0; }\
	return fY;\
}

#define MAKE_FUNC_PID_D(name,type) \
static inline type name(type E,const type P, const type I, const type D, unsigned char bCls)\
{\
	static float lastE = 0, lastE2 = 0;\
	float fdY = 0;\
	if( !bCls ){\
		fdY = P*(E-lastE) + I*E + D*(E+lastE2-2*lastE);\
		lastE2 = lastE;\
		lastE  = E;\
	}else{ lastE = lastE2 = 0; }\
	return fdY;\
}

//MAKE_FUNC_PID_S(EXAMPLE1,float,-1000,1000);
//MAKE_FUNC_PID_D(EXAMPLE2,double);

#endif


